{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\h5py\\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n",
      "  from ._conv import register_converters as _register_converters\n"
     ]
    }
   ],
   "source": [
    "\"\"\"A very simple MNIST classifier.\n",
    "See extensive documentation at\n",
    "https://www.tensorflow.org/get_started/mnist/beginners\n",
    "\"\"\"\n",
    "from __future__ import absolute_import\n",
    "from __future__ import division\n",
    "from __future__ import print_function\n",
    "\n",
    "import argparse\n",
    "import sys\n",
    "\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "\n",
    "import tensorflow as tf\n",
    "import numpy as np\n",
    "#可视化\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "FLAGS = None"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们在这里调用系统提供的Mnist数据函数为我们读入数据，如果没有下载的话则进行下载。\n",
    "\n",
    "<font color=#ff0000>**这里将data_dir改为适合你的运行环境的目录**</font>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-2-1f2e3e29ecda>:3: read_data_sets (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "WARNING:tensorflow:From C:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:260: maybe_download (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please write your own downloading logic.\n",
      "WARNING:tensorflow:From C:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:262: extract_images (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting Mnist_data/train-images-idx3-ubyte.gz\n",
      "WARNING:tensorflow:From C:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:267: extract_labels (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting Mnist_data/train-labels-idx1-ubyte.gz\n",
      "WARNING:tensorflow:From C:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:110: dense_to_one_hot (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.one_hot on tensors.\n",
      "Extracting Mnist_data/t10k-images-idx3-ubyte.gz\n",
      "Extracting Mnist_data/t10k-labels-idx1-ubyte.gz\n",
      "WARNING:tensorflow:From C:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:290: DataSet.__init__ (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "(55000, 784) (55000, 10)\n"
     ]
    }
   ],
   "source": [
    "# Import data\n",
    "data_dir = 'Mnist_data/'\n",
    "mnist = input_data.read_data_sets(data_dir, one_hot=True)\n",
    "print(mnist.train.images.shape,mnist.train.labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "定义各层神经元数量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "n_input_layer = 28 * 28  # 输入层\n",
    "n_output_layer = 10  # 输出层\n",
    "\n",
    "# 层数的选择：线性数据使用1层，非线性数据使用2层, 超级非线性使用3+层。层数、神经元过多会导致过拟合\n",
    "n_layer_1 = 500  # hide layer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义单隐层神经网络（因多隐层模型过拟合严重，故使用单隐层神经网络）\n",
    "def neural_network(x):\n",
    "    # 定义第一层\"神经元\"的权重和biases\n",
    "    layer_1_w_b = {'w_': tf.Variable(tf.truncated_normal([n_input_layer, n_layer_1])),\n",
    "                   'b_': tf.Variable(tf.constant(0.1, shape=[n_layer_1]))}\n",
    "    # 定义输出层\"神经元\"的权重和biases\n",
    "    layer_output_w_b = {'w_': tf.Variable(tf.truncated_normal([n_layer_1, n_output_layer])),\n",
    "                        'b_': tf.Variable(tf.constant(0.1, shape=[n_output_layer]))}\n",
    " \n",
    "    # w·x+b\n",
    "    layer_1 = tf.add(tf.matmul(x, layer_1_w_b['w_']), layer_1_w_b['b_'])\n",
    "    layer_1 = tf.nn.relu(layer_1)  # 激活函数 relu sigmoid  tanh elu  softplus\n",
    "    layer_output = tf.add(tf.matmul(layer_1, layer_output_w_b['w_']), layer_output_w_b['b_'])\n",
    " \n",
    "    return layer_output, layer_1_w_b, layer_output_w_b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 每次使用100条数据进行训练\n",
    "batch_size = 100\n",
    "\n",
    "x = tf.placeholder(dtype=tf.float32, shape=[None, n_input_layer])   # 输入数据占位符\n",
    "y = tf.placeholder(dtype=tf.float32, shape=[None, n_output_layer])   # 输出数据占位符"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 使用数据训练神经网络\n",
    "def train_neural_network(X, Y, epochs=10):\n",
    "    #创建神经网络\n",
    "    y, layer_1_w_b, layer_output_w_b = neural_network(X)\n",
    "    #代价函数\n",
    "    cost_func = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels=tf.argmax(Y,1), logits= y))\n",
    "    #惩罚因子\n",
    "    regularization_rate = 0.0001\n",
    "    #计算L2正则化损失函数\n",
    "    regularizer = tf.contrib.layers.l2_regularizer(regularization_rate)\n",
    "    #将变量的L2正则化损失添加到集合中\n",
    "    regularization = regularizer(layer_1_w_b['w_']) +  regularizer(layer_output_w_b['w_'])\n",
    "    \n",
    "    #获取整个模型的损失函数,tf.get_collection(\"losses\")返回集合中定义的损失\n",
    "    #将整个集合中的损失相加得到整个模型的损失函数\n",
    "    loss = cost_func + regularization\n",
    "\n",
    "    #学习速率，随迭代次数进行递减\n",
    "    global_step = tf.Variable(0, trainable=False)\n",
    "    #设置基础学习率\n",
    "    starter_learning_rate = 0.8\n",
    "    #设置学习率的衰减率\n",
    "    learning_rate_decay = 0.99\n",
    "    #设置指数衰减学习率\n",
    "    learning_rate = tf.train.exponential_decay(starter_learning_rate, global_step, mnist.train.num_examples/batch_size/2, learning_rate_decay)\n",
    "    \n",
    "    train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)  \n",
    "    \n",
    "    #每迭代一次需要更新神经网络中的参数\n",
    "    train_op = tf.group(train_step)\n",
    " \n",
    "    with tf.Session() as session:\n",
    "        session.run(tf.global_variables_initializer())\n",
    "        \n",
    "        correct = tf.equal(tf.argmax(y, 1), tf.argmax(Y, 1))\n",
    "        accuracy = tf.reduce_mean(tf.cast(correct, 'float'))\n",
    " \n",
    "        epoch_loss = 0\n",
    "        epoch_loss_mat = []\n",
    "        epoch_accuracy_mat = []\n",
    "        epoch_accuracy_t_mat = []\n",
    "        for epoch in range(epochs):\n",
    "            for i in range(int(mnist.train.num_examples / batch_size)):\n",
    "                batch_xs, batch_ys = mnist.train.next_batch(batch_size)\n",
    "                _, cost_vel = session.run([train_op, loss], feed_dict={X: batch_xs, Y: batch_ys, global_step:i*(epoch+1)})\n",
    "                epoch_loss += cost_vel\n",
    "            epoch_accuracy = accuracy.eval({X: mnist.train.images, Y: mnist.train.labels})\n",
    "            epoch_accuracy_t = accuracy.eval({X: mnist.test.images, Y: mnist.test.labels})\n",
    "            print('epoch ', epoch, ' loss      : ', epoch_loss)\n",
    "            print('epoch ', epoch, ' accuracy  : ', epoch_accuracy)\n",
    "            print('epoch ', epoch, ' accuracy_t: ', epoch_accuracy_t)\n",
    "            epoch_loss_mat.append(epoch_loss)\n",
    "            epoch_accuracy_mat.append(epoch_accuracy)\n",
    "            epoch_accuracy_t_mat.append(epoch_accuracy_t)\n",
    "            epoch_loss = 0\n",
    "        \n",
    "        print('训练准确率: ', accuracy.eval({X: mnist.train.images, Y: mnist.train.labels}))\n",
    "        print('测试准确率: ', accuracy.eval({X: mnist.test.images, Y: mnist.test.labels}))\n",
    "        \n",
    "        plt.plot(range(epochs), epoch_loss_mat) \n",
    "        plt.xlabel('epochs')\n",
    "        plt.ylabel('epoch_loss')\n",
    "        plt.show() \n",
    "        \n",
    "        plt.plot(range(epochs), epoch_accuracy_mat, label='Train Accuracy') \n",
    "        plt.plot(range(epochs), epoch_accuracy_t_mat, label='Test Accuracy')\n",
    "        plt.legend()\n",
    "        plt.xlabel('epochs')\n",
    "        plt.ylabel('accuracy')\n",
    "        plt.show() "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch  0  loss      :  12680.927929878235\n",
      "epoch  0  accuracy  :  0.89541817\n",
      "epoch  0  accuracy_t:  0.8851\n",
      "epoch  1  loss      :  8125.847089767456\n",
      "epoch  1  accuracy  :  0.9329091\n",
      "epoch  1  accuracy_t:  0.9175\n",
      "epoch  2  loss      :  7406.082667350769\n",
      "epoch  2  accuracy  :  0.9447455\n",
      "epoch  2  accuracy_t:  0.9274\n",
      "epoch  3  loss      :  6780.959805488586\n",
      "epoch  3  accuracy  :  0.95527273\n",
      "epoch  3  accuracy_t:  0.9367\n",
      "epoch  4  loss      :  6221.335705757141\n",
      "epoch  4  accuracy  :  0.9627454\n",
      "epoch  4  accuracy_t:  0.9399\n",
      "epoch  5  loss      :  5717.283677101135\n",
      "epoch  5  accuracy  :  0.96625453\n",
      "epoch  5  accuracy_t:  0.9419\n",
      "epoch  6  loss      :  5259.4876317977905\n",
      "epoch  6  accuracy  :  0.97114545\n",
      "epoch  6  accuracy_t:  0.9471\n",
      "epoch  7  loss      :  4843.781227111816\n",
      "epoch  7  accuracy  :  0.97583634\n",
      "epoch  7  accuracy_t:  0.9489\n",
      "epoch  8  loss      :  4465.037503242493\n",
      "epoch  8  accuracy  :  0.97925454\n",
      "epoch  8  accuracy_t:  0.9526\n",
      "epoch  9  loss      :  4120.0101437568665\n",
      "epoch  9  accuracy  :  0.9815636\n",
      "epoch  9  accuracy_t:  0.9523\n",
      "epoch  10  loss      :  3805.3281831741333\n",
      "epoch  10  accuracy  :  0.9845818\n",
      "epoch  10  accuracy_t:  0.9551\n",
      "epoch  11  loss      :  3516.9414467811584\n",
      "epoch  11  accuracy  :  0.98612726\n",
      "epoch  11  accuracy_t:  0.9556\n",
      "epoch  12  loss      :  3253.9696803092957\n",
      "epoch  12  accuracy  :  0.9869273\n",
      "epoch  12  accuracy_t:  0.9567\n",
      "epoch  13  loss      :  3012.4225058555603\n",
      "epoch  13  accuracy  :  0.9884\n",
      "epoch  13  accuracy_t:  0.9584\n",
      "epoch  14  loss      :  2791.4922952651978\n",
      "epoch  14  accuracy  :  0.9905273\n",
      "epoch  14  accuracy_t:  0.9603\n",
      "epoch  15  loss      :  2588.4165058135986\n",
      "epoch  15  accuracy  :  0.9906\n",
      "epoch  15  accuracy_t:  0.9604\n",
      "epoch  16  loss      :  2402.046637535095\n",
      "epoch  16  accuracy  :  0.9924545\n",
      "epoch  16  accuracy_t:  0.9619\n",
      "epoch  17  loss      :  2231.0299310684204\n",
      "epoch  17  accuracy  :  0.9932182\n",
      "epoch  17  accuracy_t:  0.9624\n",
      "epoch  18  loss      :  2073.599127292633\n",
      "epoch  18  accuracy  :  0.9942545\n",
      "epoch  18  accuracy_t:  0.9645\n",
      "epoch  19  loss      :  1928.5751519203186\n",
      "epoch  19  accuracy  :  0.99465454\n",
      "epoch  19  accuracy_t:  0.9651\n",
      "epoch  20  loss      :  1795.3706271648407\n",
      "epoch  20  accuracy  :  0.9955091\n",
      "epoch  20  accuracy_t:  0.9658\n",
      "epoch  21  loss      :  1672.5268437862396\n",
      "epoch  21  accuracy  :  0.99627274\n",
      "epoch  21  accuracy_t:  0.9663\n",
      "epoch  22  loss      :  1558.965383529663\n",
      "epoch  22  accuracy  :  0.9965818\n",
      "epoch  22  accuracy_t:  0.9674\n",
      "epoch  23  loss      :  1454.333259344101\n",
      "epoch  23  accuracy  :  0.9968\n",
      "epoch  23  accuracy_t:  0.9683\n",
      "epoch  24  loss      :  1357.755678653717\n",
      "epoch  24  accuracy  :  0.99750906\n",
      "epoch  24  accuracy_t:  0.9676\n",
      "epoch  25  loss      :  1268.4458827972412\n",
      "epoch  25  accuracy  :  0.99767274\n",
      "epoch  25  accuracy_t:  0.9693\n",
      "epoch  26  loss      :  1185.6244552135468\n",
      "epoch  26  accuracy  :  0.99783635\n",
      "epoch  26  accuracy_t:  0.9699\n",
      "epoch  27  loss      :  1109.41798889637\n",
      "epoch  27  accuracy  :  0.9982182\n",
      "epoch  27  accuracy_t:  0.9704\n",
      "epoch  28  loss      :  1038.5059162378311\n",
      "epoch  28  accuracy  :  0.9984546\n",
      "epoch  28  accuracy_t:  0.9701\n",
      "epoch  29  loss      :  972.7211606502533\n",
      "epoch  29  accuracy  :  0.9986727\n",
      "epoch  29  accuracy_t:  0.9701\n",
      "epoch  30  loss      :  912.0221748352051\n",
      "epoch  30  accuracy  :  0.99863636\n",
      "epoch  30  accuracy_t:  0.9713\n",
      "epoch  31  loss      :  855.4648019075394\n",
      "epoch  31  accuracy  :  0.99907273\n",
      "epoch  31  accuracy_t:  0.9717\n",
      "epoch  32  loss      :  803.0189447402954\n",
      "epoch  32  accuracy  :  0.99912727\n",
      "epoch  32  accuracy_t:  0.9715\n",
      "epoch  33  loss      :  754.3509804010391\n",
      "epoch  33  accuracy  :  0.9988545\n",
      "epoch  33  accuracy_t:  0.9724\n",
      "epoch  34  loss      :  709.0366494655609\n",
      "epoch  34  accuracy  :  0.99936366\n",
      "epoch  34  accuracy_t:  0.9745\n",
      "epoch  35  loss      :  666.9024301767349\n",
      "epoch  35  accuracy  :  0.9992727\n",
      "epoch  35  accuracy_t:  0.9741\n",
      "epoch  36  loss      :  627.6155215501785\n",
      "epoch  36  accuracy  :  0.9994\n",
      "epoch  36  accuracy_t:  0.9751\n",
      "epoch  37  loss      :  591.149950504303\n",
      "epoch  37  accuracy  :  0.9995091\n",
      "epoch  37  accuracy_t:  0.9755\n",
      "epoch  38  loss      :  557.1902042627335\n",
      "epoch  38  accuracy  :  0.9996\n",
      "epoch  38  accuracy_t:  0.9755\n",
      "epoch  39  loss      :  525.4067770838737\n",
      "epoch  39  accuracy  :  0.99963635\n",
      "epoch  39  accuracy_t:  0.9762\n",
      "epoch  40  loss      :  495.84435069561005\n",
      "epoch  40  accuracy  :  0.9996182\n",
      "epoch  40  accuracy_t:  0.9767\n",
      "epoch  41  loss      :  468.1897292137146\n",
      "epoch  41  accuracy  :  0.99963635\n",
      "epoch  41  accuracy_t:  0.9759\n",
      "epoch  42  loss      :  442.32064014673233\n",
      "epoch  42  accuracy  :  0.9996909\n",
      "epoch  42  accuracy_t:  0.9754\n",
      "epoch  43  loss      :  418.3290551304817\n",
      "epoch  43  accuracy  :  0.9996909\n",
      "epoch  43  accuracy_t:  0.977\n",
      "epoch  44  loss      :  395.8000295162201\n",
      "epoch  44  accuracy  :  0.9996909\n",
      "epoch  44  accuracy_t:  0.9771\n",
      "epoch  45  loss      :  374.6416262984276\n",
      "epoch  45  accuracy  :  0.99972725\n",
      "epoch  45  accuracy_t:  0.978\n",
      "epoch  46  loss      :  355.01299500465393\n",
      "epoch  46  accuracy  :  0.99972725\n",
      "epoch  46  accuracy_t:  0.9778\n",
      "epoch  47  loss      :  336.47707110643387\n",
      "epoch  47  accuracy  :  0.9997454\n",
      "epoch  47  accuracy_t:  0.9782\n",
      "epoch  48  loss      :  319.11642932891846\n",
      "epoch  48  accuracy  :  0.99970907\n",
      "epoch  48  accuracy_t:  0.9786\n",
      "epoch  49  loss      :  302.9243657588959\n",
      "epoch  49  accuracy  :  0.9998\n",
      "epoch  49  accuracy_t:  0.9787\n",
      "epoch  50  loss      :  287.64874309301376\n",
      "epoch  50  accuracy  :  0.9998182\n",
      "epoch  50  accuracy_t:  0.9772\n",
      "epoch  51  loss      :  273.3408074975014\n",
      "epoch  51  accuracy  :  0.9998\n",
      "epoch  51  accuracy_t:  0.9779\n",
      "epoch  52  loss      :  259.91690653562546\n",
      "epoch  52  accuracy  :  0.99985456\n",
      "epoch  52  accuracy_t:  0.9783\n",
      "epoch  53  loss      :  247.30114194750786\n",
      "epoch  53  accuracy  :  0.9998364\n",
      "epoch  53  accuracy_t:  0.9779\n",
      "epoch  54  loss      :  235.45168814063072\n",
      "epoch  54  accuracy  :  0.9998364\n",
      "epoch  54  accuracy_t:  0.9791\n",
      "epoch  55  loss      :  224.32406011223793\n",
      "epoch  55  accuracy  :  0.9998364\n",
      "epoch  55  accuracy_t:  0.9792\n",
      "epoch  56  loss      :  213.7974715232849\n",
      "epoch  56  accuracy  :  0.9998909\n",
      "epoch  56  accuracy_t:  0.9783\n",
      "epoch  57  loss      :  203.83263179659843\n",
      "epoch  57  accuracy  :  0.99987274\n",
      "epoch  57  accuracy_t:  0.9787\n",
      "epoch  58  loss      :  194.58947071433067\n",
      "epoch  58  accuracy  :  0.99985456\n",
      "epoch  58  accuracy_t:  0.9791\n",
      "epoch  59  loss      :  185.83903050422668\n",
      "epoch  59  accuracy  :  0.9998364\n",
      "epoch  59  accuracy_t:  0.9796\n",
      "epoch  60  loss      :  177.52313262224197\n",
      "epoch  60  accuracy  :  0.99987274\n",
      "epoch  60  accuracy_t:  0.9793\n",
      "epoch  61  loss      :  169.76374250650406\n",
      "epoch  61  accuracy  :  0.99987274\n",
      "epoch  61  accuracy_t:  0.9797\n",
      "epoch  62  loss      :  162.48309582471848\n",
      "epoch  62  accuracy  :  0.99987274\n",
      "epoch  62  accuracy_t:  0.9796\n",
      "epoch  63  loss      :  155.51582211256027\n",
      "epoch  63  accuracy  :  0.9998909\n",
      "epoch  63  accuracy_t:  0.9797\n",
      "epoch  64  loss      :  149.00269135832787\n",
      "epoch  64  accuracy  :  0.99987274\n",
      "epoch  64  accuracy_t:  0.9797\n",
      "epoch  65  loss      :  142.76316763460636\n",
      "epoch  65  accuracy  :  0.9998909\n",
      "epoch  65  accuracy_t:  0.9796\n",
      "epoch  66  loss      :  136.90081652998924\n",
      "epoch  66  accuracy  :  0.9998909\n",
      "epoch  66  accuracy_t:  0.9798\n",
      "epoch  67  loss      :  131.45051327347755\n",
      "epoch  67  accuracy  :  0.9999091\n",
      "epoch  67  accuracy_t:  0.9801\n",
      "epoch  68  loss      :  126.10128328204155\n",
      "epoch  68  accuracy  :  0.99987274\n",
      "epoch  68  accuracy_t:  0.9797\n",
      "epoch  69  loss      :  121.18256954848766\n",
      "epoch  69  accuracy  :  0.9999273\n",
      "epoch  69  accuracy_t:  0.979\n",
      "epoch  70  loss      :  116.6503279209137\n",
      "epoch  70  accuracy  :  0.9999091\n",
      "epoch  70  accuracy_t:  0.98\n",
      "epoch  71  loss      :  112.08671540021896\n",
      "epoch  71  accuracy  :  0.9999273\n",
      "epoch  71  accuracy_t:  0.98\n",
      "epoch  72  loss      :  107.85663495957851\n",
      "epoch  72  accuracy  :  0.9999273\n",
      "epoch  72  accuracy_t:  0.9799\n",
      "epoch  73  loss      :  103.8853689134121\n",
      "epoch  73  accuracy  :  0.9999091\n",
      "epoch  73  accuracy_t:  0.9798\n",
      "epoch  74  loss      :  100.09405459463596\n",
      "epoch  74  accuracy  :  0.9998909\n",
      "epoch  74  accuracy_t:  0.9805\n",
      "epoch  75  loss      :  96.58588591217995\n",
      "epoch  75  accuracy  :  0.99994546\n",
      "epoch  75  accuracy_t:  0.9797\n",
      "epoch  76  loss      :  93.12288491427898\n",
      "epoch  76  accuracy  :  0.9999273\n",
      "epoch  76  accuracy_t:  0.9806\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch  77  loss      :  89.84582224488258\n",
      "epoch  77  accuracy  :  0.9998909\n",
      "epoch  77  accuracy_t:  0.981\n",
      "epoch  78  loss      :  86.87932232022285\n",
      "epoch  78  accuracy  :  0.99994546\n",
      "epoch  78  accuracy_t:  0.981\n",
      "epoch  79  loss      :  83.90528351068497\n",
      "epoch  79  accuracy  :  0.9999273\n",
      "epoch  79  accuracy_t:  0.98\n",
      "epoch  80  loss      :  81.12369698286057\n",
      "epoch  80  accuracy  :  0.99994546\n",
      "epoch  80  accuracy_t:  0.9797\n",
      "epoch  81  loss      :  78.57822208106518\n",
      "epoch  81  accuracy  :  0.99994546\n",
      "epoch  81  accuracy_t:  0.981\n",
      "epoch  82  loss      :  75.98219493031502\n",
      "epoch  82  accuracy  :  0.99994546\n",
      "epoch  82  accuracy_t:  0.9811\n",
      "epoch  83  loss      :  73.67381496727467\n",
      "epoch  83  accuracy  :  0.99994546\n",
      "epoch  83  accuracy_t:  0.9814\n",
      "epoch  84  loss      :  71.38766480982304\n",
      "epoch  84  accuracy  :  0.99994546\n",
      "epoch  84  accuracy_t:  0.9808\n",
      "epoch  85  loss      :  69.17433578521013\n",
      "epoch  85  accuracy  :  0.99996364\n",
      "epoch  85  accuracy_t:  0.9806\n",
      "epoch  86  loss      :  67.17384674400091\n",
      "epoch  86  accuracy  :  0.99994546\n",
      "epoch  86  accuracy_t:  0.9807\n",
      "epoch  87  loss      :  65.2057918831706\n",
      "epoch  87  accuracy  :  0.99994546\n",
      "epoch  87  accuracy_t:  0.9812\n",
      "epoch  88  loss      :  63.32926311343908\n",
      "epoch  88  accuracy  :  0.99994546\n",
      "epoch  88  accuracy_t:  0.9809\n",
      "epoch  89  loss      :  61.48672790080309\n",
      "epoch  89  accuracy  :  0.9999273\n",
      "epoch  89  accuracy_t:  0.9811\n",
      "epoch  90  loss      :  59.816437520086765\n",
      "epoch  90  accuracy  :  0.9999273\n",
      "epoch  90  accuracy_t:  0.9807\n",
      "epoch  91  loss      :  58.13186506181955\n",
      "epoch  91  accuracy  :  0.99994546\n",
      "epoch  91  accuracy_t:  0.9814\n",
      "epoch  92  loss      :  56.660609014332294\n",
      "epoch  92  accuracy  :  0.9999273\n",
      "epoch  92  accuracy_t:  0.9813\n",
      "epoch  93  loss      :  55.16680637747049\n",
      "epoch  93  accuracy  :  0.99996364\n",
      "epoch  93  accuracy_t:  0.9812\n",
      "epoch  94  loss      :  53.75571097433567\n",
      "epoch  94  accuracy  :  0.99994546\n",
      "epoch  94  accuracy_t:  0.9813\n",
      "epoch  95  loss      :  52.38074363023043\n",
      "epoch  95  accuracy  :  0.9999273\n",
      "epoch  95  accuracy_t:  0.981\n",
      "epoch  96  loss      :  51.10069265961647\n",
      "epoch  96  accuracy  :  0.99996364\n",
      "epoch  96  accuracy_t:  0.981\n",
      "epoch  97  loss      :  49.979678489267826\n",
      "epoch  97  accuracy  :  0.9999273\n",
      "epoch  97  accuracy_t:  0.9813\n",
      "epoch  98  loss      :  48.75008971244097\n",
      "epoch  98  accuracy  :  0.99994546\n",
      "epoch  98  accuracy_t:  0.9813\n",
      "epoch  99  loss      :  47.64698948711157\n",
      "epoch  99  accuracy  :  0.99996364\n",
      "epoch  99  accuracy_t:  0.9812\n",
      "训练准确率:  0.99996364\n",
      "测试准确率:  0.9812\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "train_neural_network(X=x, Y=y, epochs=100)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
